import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";

//游戏控制器，控制其他的所有类
class GameControl{
    //定义三个数学
    //蛇
    snake:Snake;
    //食物
    food:Food;
    //记分牌
    scorePanel:ScorePanel;

    //创建一个属性来存储蛇头的移动方向（也就是按键的方向）
    direction:string = 'Right';

    //创建一个属性用来记录游戏是否结束
    isLive = true;

    constructor(){
        this.snake = new Snake();
        this.food = new Food();
        this.scorePanel = new ScorePanel(10,2);
        this.init();
    }

    //游戏初始化方法，调用后游戏开始
    init(){
        //绑定键盘按键按下的事件
        document.addEventListener('keydown',this.keydownHandler.bind(this))
        //调用run方法，使蛇移动
        this.run();
    }

    //创建一个键盘按下的响应函数
    keydownHandler(event:KeyboardEvent){
        //TODO 需要检查event.key的值是否合法

        //  修改direction属性
        if(event.key == 'ArrowUp' || event.key == 'ArrowDown' || event.key == 'ArrowRight' || event.key == 'ArrowLeft' )
            this.direction = event.key
    }

    //创建一个控制蛇移动的方法
    run(){
        /**
         * 根据方向（this.direction）来使蛇的位置改变
         *  向上 top 减少
         *  向下 top 增加
         *  向左 left 减少
         *  向右 left 增加
         */
        //获取蛇现在的坐标
        let X = this.snake.X;
        let Y = this.snake.Y;

        //根据按键的方向来修改X值额Y值
        switch(this.direction){
            //向上移动
            case "ArrowUp":
            case "Up":
                Y-=10;
                break;
            //向下移动
            case "ArrowDown":
            case "Down":
                Y+=10;
                break;
            //向左移动
            case "ArrowLeft":
            case "Left":
                X-=10;
                break;
            //向右移动
            case "ArrowRight":
            case "Right":
                X+=10;
                break;
        }

        //检查蛇是否吃到食物
        this.checkEat(X,Y);

        //修改蛇的X和Y值
        try{
            this.snake.X = X;
            this.snake.Y = Y;
        }catch(e:any){
            //进入了catch，说明出现了异常
            alert(e.message + 'GAME OVER！');
            this.isLive = false;
        }
        
        //开启一个定时调用
        this.isLive && setTimeout(this.run.bind(this),300 - (this.scorePanel.level - 1) * 30);
    }

    //检查蛇是否吃到食物
    checkEat(X:number,Y:number){
         if(X === this.food.X && Y === this.food.Y){
            console.log('吃到食物了')
            this.food.change();
            //分数增加
            this.scorePanel.addScore();
            //蛇要加一节
            this.snake.addBody();
         }
    }
}

export default GameControl;